# -*- coding: utf-8 -*-
#autor: João Rebocho Nº 6035
#data: 7/10/2013
#obs: guia da aula prática 3
#

#Declaracao de Classe
import xlrd
class Cartao:
    """
    uma classe que representa o conceito de cartao
    """

    entidade = "" # uma variavel da classe
    def __init__(self, numero = 0):
        """ construtor """
        self.numero = numero #uma variavel de instancia
        pass

    def __str__(self):
        """ resultado da impressao de um objecto """
        return "numero {0}".format(self.numero)
    pass

# instancias da classe
obj1 = Cartao(123456789)
obj2 = Cartao(7843972)
Cartao.entidade = "Governo"
print obj1, obj1.entidade
print obj2, obj2.entidade

#Uso de metodos
#Função definida fora da classe: mau codigo
def f1(self, x, y):
    return min(x, y)

class C:
    f = f1
    pass
obj = C()
print obj.f(2, 4)

class Saco:
    def __init__(self):
        self.data = []
        pass
    def add(self, x):
        self.data.append(x)
        pass
    def add2(self, x):
        self.add(x)
        self.add(x)
        pass
    pass
obj = Saco()
obj.add("arroz")
print obj.data

#Informação Adicional
#alguma informacao sobre as classes
class Fruta:
	"""documentacao da classe Fruta"""
	def __init__(self, tipo):
		""" inicializa com tipo de fruta """
		self.tipo = tipo
		pass
	
	def citrino(self, citrus = False):
		""" por defeito __citrus == False """
		self.__citrus = citrus
		pass
	pass

print Fruta.__doc__
obj = Fruta("pessego")
print obj.__class__

#Herança Múltipla
class MeioTransporte:
	def __init__(self, combustivel = "gasolina"):
		self.combustivel = combustivel
		pass
	
	def __str__(self):
		return " combustivel =" + str(self.combustivel)
	pass

class Rodas:
	def __init__(self, numero_rodas = 4):
		self.numero_rodas = numero_rodas
		pass
	
	def __str__(self):
		return " numero rodas =" + str(self.numero_rodas)
	pass

class Carro(MeioTransporte, Rodas):
	def __init__(self, combustivel, numero_rodas):
		MeioTransporte.__init__(self, combustivel)
		Rodas.__init__(self, numero_rodas)
		pass 
	def __str__(self):
		return MeioTransporte.__str__(self) + Rodas.__str__(self)
	
	pass
	
obj = Carro("gasoleo", 6)
print obj

#Variaveis Privadas e Verificação de Tipos
class MeioTransporte:
	def __init__(self, combustivel = "gasolina"):
		self.combustivel = combustivel
		self.__privado = True
		pass
	
	def __str__(self):
		return " combustivel =" + str(self.combustivel)
	pass



class Carro(MeioTransporte):
	def __init__(self, combustivel):
		MeioTransporte.__init__(self, combustivel)
		pass 
	def __str__(self):
		return MeioTransporte.__str__(self) + Rodas.__str__(self)
	
	pass

obj = Carro("gasoleo")
print isinstance(obj, MeioTransporte)
print issubclass(Carro, MeioTransporte)
try:
	print obj.__privado
except AttributeError:
	print "__privado e  uma variavel privada"
	
#Classes Derivadas de Novo Estilo
class Cartao(object):
	def __init__(self, nome):
		self.nome = nome
		pass
	def __str__(self):
		return str(self.nome)
	pass 

class CartaoCidadao(Cartao):
	def __init__(self, nome, numero):
		self.numero = numero
		super(CartaoCidadao, self).__init__(nome)
		pass 
	pass 

class ListaCidadao(list):
	def __str__(self):
		s = ""; c = 0
		for x  in self: c +=1; s+= "\n" + str(c) + " "+ str(x)
		return s
	pass 

obj = CartaoCidadao("Eleuterio Coelho", "12345")
print obj.nome
lista1 = ListaCidadao()
lista1.append(Cartao("Ildefonso Coelho"))
lista1.append(Cartao("Hermeneglido Coelho"))
print lista1 

#Exceções

class UserClass:
	pass
try:
	raise(UserClass)
except UserClass:
	print "arggghhh..."	


	
	 
		
		
	
		
